#ifndef HTTP_INTERFACE_H
#define HTTP_INTERFACE_H

#include <string>
#include <vector>
#include <map>
#include <functional>

// 结构体：用于封装 HTTP 响应数据
struct HttpResponse {
    int statusCode = 0;                                 // HTTP 状态码 (例如 200, 404)
    std::map<std::string, std::string> headers;         // HTTP 响应头
    std::string body;                                   // HTTP 响应体
    std::string errorMessage;                           // 如果请求失败或超时，记录错误信息
    bool success = false;                               // 便捷标志：如果 statusCode 是 2xx 且 errorMessage 为空，则为 true

    HttpResponse() = default; // 默认构造函数

    // 构造函数，方便直接初始化
    HttpResponse(int code, std::map<std::string, std::string> hdrs, std::string bdy, std::string err_msg)
        : statusCode(code), headers(std::move(hdrs)), body(std::move(bdy)), errorMessage(std::move(err_msg)) {
        if (statusCode >= 200 && statusCode < 300 && errorMessage.empty()) {
            success = true;
        }
    }
};

// 回调函数类型：用于异步 HTTP 请求
// 回调函数接收一个 HttpResponse 对象作为参数
using HttpCallback = std::function<void(const HttpResponse& response)>;

// 通用 HTTP 客户端接口类
class HttpInterface {
public:
    virtual ~HttpInterface() {}

    // --- 配置方法 ---

    /**
     * @brief 设置所有请求的基础 URL (例如 "http://api.example.com")。
     * 后续请求可以使用相对路径。
     * @param base_url 基础 URL 字符串。
     */
    virtual void setBaseUrl(const std::string& base_url) = 0;

    /**
     * @brief 添加或更新一个默认的 HTTP 请求头，该请求头将随每个请求发送。
     * 对于常见的头部（如 'Authorization', 'User-Agent', 'Content-Type'）很有用。
     * @param name 头部名称。
     * @param value 头部值。
     */
    virtual void setDefaultHeader(const std::string& name, const std::string& value) = 0;

    /**
     * @brief 移除一个默认的 HTTP 请求头。
     * @param name 要移除的头部名称。
     */
    virtual void removeDefaultHeader(const std::string& name) = 0;

    /**
     * @brief 清除所有已设置的默认 HTTP 请求头。
     */
    virtual void clearDefaultHeaders() = 0;

    /**
     * @brief 设置 HTTP 请求的超时时间。
     * @param timeout_ms 超时时间（毫秒）。
     */
    virtual void setTimeout(int timeout_ms) = 0;

    // --- 异步 HTTP 请求方法 ---
    // 所有请求方法都是异步的，并在完成后调用提供的回调函数。

    /**
     * @brief 执行 HTTP GET 请求。
     * @param path 相对路径或完整 URL (如果未设置基础 URL)。
     * @param callback 请求完成后的回调函数。
     * @param query_params (可选) 附加到 URL 的查询参数。
     * @param custom_headers (可选) 特定于此请求的额外头部。
     */
    virtual void get(
        const std::string& path,
        HttpCallback callback,
        const std::map<std::string, std::string>& query_params = {},
        const std::map<std::string, std::string>& custom_headers = {}
    ) = 0;

    /**
     * @brief 执行 HTTP POST 请求。
     * @param path 相对路径或完整 URL。
     * @param body 请求体数据。
     * @param callback 请求完成后的回调函数。
     * @param content_type (可选) 请求体的 'Content-Type' (例如 "application/json", "application/x-www-form-urlencoded")。
     *                     如果未提供或为空，实现可能会依赖于默认头部设置或自行决定。
     * @param custom_headers (可选) 特定于此请求的额外头部。
     */
    virtual void post(
        const std::string& path,
        const std::string& body,
        HttpCallback callback,
        const std::string& content_type = "", // 允许为空，让实现决定或使用默认值
        const std::map<std::string, std::string>& custom_headers = {}
    ) = 0;

    /**
     * @brief 执行 HTTP PUT 请求。
     * (参数与 post 方法类似)
     */
    virtual void put(
        const std::string& path,
        const std::string& body,
        HttpCallback callback,
        const std::string& content_type = "",
        const std::map<std::string, std::string>& custom_headers = {}
    ) = 0;

    /**
     * @brief 执行 HTTP DELETE 请求。
     * (参数与 get 方法类似，通常没有请求体或查询参数，但可以有自定义头部)
     */
    virtual void del( // 'delete' is a keyword in C++, so using 'del' or 'remove'
        const std::string& path,
        HttpCallback callback,
        const std::map<std::string, std::string>& custom_headers = {}
    ) = 0;

    /**
     * @brief 执行 HTTP PATCH 请求。
     * (参数与 post 方法类似)
     */
    virtual void patch(
        const std::string& path,
        const std::string& body,
        HttpCallback callback,
        const std::string& content_type = "",
        const std::map<std::string, std::string>& custom_headers = {}
    ) = 0;

    // 加同步方法的接口，但这通常不推荐用于嵌入式或需要响应性的系统。
    virtual HttpResponse getSync(const std::string& path, const std::map<std::string, std::string>& query_params = {}, const std::map<std::string, std::string>& custom_headers = {}) = 0;
    virtual HttpResponse postSync(const std::string& path, const std::string& body, const std::string& content_type = "", const std::map<std::string, std::string>& custom_headers = {}) = 0;
    virtual HttpResponse putSync(const std::string& path, const std::string& body, const std::string& content_type = "", const std::map<std::string, std::string>& custom_headers = {}) = 0;
    virtual HttpResponse delSync(const std::string& path, const std::map<std::string, std::string>& custom_headers = {}) = 0;
    virtual HttpResponse patchSync(const std::string& path, const std::string& body, const std::string& content_type = "", const std::map<std::string, std::string>& custom_headers = {}) = 0;

protected:
    // 可以在派生类中使用的受保护成员（如果需要）
    std::string base_url_;
    std::map<std::string, std::string> default_headers_;
    int timeout_ms_ = 10000; // 默认超时10秒
};

#endif // HTTP_INTERFACE_H
